/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.MarcaRepuesto;
import entidades.ModeloRepuesto;
import entidades.Repuesto;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author g
 */
public class ModeloRepuestoJpaController implements Serializable {

    public ModeloRepuestoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ModeloRepuesto modeloRepuesto) {
        if (modeloRepuesto.getLs_repuestos() == null) {
            modeloRepuesto.setLs_repuestos(new ArrayList<Repuesto>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            MarcaRepuesto marca = modeloRepuesto.getMarca();
            if (marca != null) {
                marca = em.getReference(marca.getClass(), marca.getId());
                modeloRepuesto.setMarca(marca);
            }
            List<Repuesto> attachedLs_repuestos = new ArrayList<Repuesto>();
            for (Repuesto ls_repuestosRepuestoToAttach : modeloRepuesto.getLs_repuestos()) {
                ls_repuestosRepuestoToAttach = em.getReference(ls_repuestosRepuestoToAttach.getClass(), ls_repuestosRepuestoToAttach.getId());
                attachedLs_repuestos.add(ls_repuestosRepuestoToAttach);
            }
            modeloRepuesto.setLs_repuestos(attachedLs_repuestos);
            em.persist(modeloRepuesto);
            if (marca != null) {
                marca.getLs_modelos().add(modeloRepuesto);
                marca = em.merge(marca);
            }
            for (Repuesto ls_repuestosRepuesto : modeloRepuesto.getLs_repuestos()) {
                ModeloRepuesto oldModeloRepuestoOfLs_repuestosRepuesto = ls_repuestosRepuesto.getModeloRepuesto();
                ls_repuestosRepuesto.setModeloRepuesto(modeloRepuesto);
                ls_repuestosRepuesto = em.merge(ls_repuestosRepuesto);
                if (oldModeloRepuestoOfLs_repuestosRepuesto != null) {
                    oldModeloRepuestoOfLs_repuestosRepuesto.getLs_repuestos().remove(ls_repuestosRepuesto);
                    oldModeloRepuestoOfLs_repuestosRepuesto = em.merge(oldModeloRepuestoOfLs_repuestosRepuesto);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ModeloRepuesto modeloRepuesto) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ModeloRepuesto persistentModeloRepuesto = em.find(ModeloRepuesto.class, modeloRepuesto.getId());
            MarcaRepuesto marcaOld = persistentModeloRepuesto.getMarca();
            MarcaRepuesto marcaNew = modeloRepuesto.getMarca();
            List<Repuesto> ls_repuestosOld = persistentModeloRepuesto.getLs_repuestos();
            List<Repuesto> ls_repuestosNew = modeloRepuesto.getLs_repuestos();
            if (marcaNew != null) {
                marcaNew = em.getReference(marcaNew.getClass(), marcaNew.getId());
                modeloRepuesto.setMarca(marcaNew);
            }
            List<Repuesto> attachedLs_repuestosNew = new ArrayList<Repuesto>();
            for (Repuesto ls_repuestosNewRepuestoToAttach : ls_repuestosNew) {
                ls_repuestosNewRepuestoToAttach = em.getReference(ls_repuestosNewRepuestoToAttach.getClass(), ls_repuestosNewRepuestoToAttach.getId());
                attachedLs_repuestosNew.add(ls_repuestosNewRepuestoToAttach);
            }
            ls_repuestosNew = attachedLs_repuestosNew;
            modeloRepuesto.setLs_repuestos(ls_repuestosNew);
            modeloRepuesto = em.merge(modeloRepuesto);
            if (marcaOld != null && !marcaOld.equals(marcaNew)) {
                marcaOld.getLs_modelos().remove(modeloRepuesto);
                marcaOld = em.merge(marcaOld);
            }
            if (marcaNew != null && !marcaNew.equals(marcaOld)) {
                marcaNew.getLs_modelos().add(modeloRepuesto);
                marcaNew = em.merge(marcaNew);
            }
            for (Repuesto ls_repuestosOldRepuesto : ls_repuestosOld) {
                if (!ls_repuestosNew.contains(ls_repuestosOldRepuesto)) {
                    ls_repuestosOldRepuesto.setModeloRepuesto(null);
                    ls_repuestosOldRepuesto = em.merge(ls_repuestosOldRepuesto);
                }
            }
            for (Repuesto ls_repuestosNewRepuesto : ls_repuestosNew) {
                if (!ls_repuestosOld.contains(ls_repuestosNewRepuesto)) {
                    ModeloRepuesto oldModeloRepuestoOfLs_repuestosNewRepuesto = ls_repuestosNewRepuesto.getModeloRepuesto();
                    ls_repuestosNewRepuesto.setModeloRepuesto(modeloRepuesto);
                    ls_repuestosNewRepuesto = em.merge(ls_repuestosNewRepuesto);
                    if (oldModeloRepuestoOfLs_repuestosNewRepuesto != null && !oldModeloRepuestoOfLs_repuestosNewRepuesto.equals(modeloRepuesto)) {
                        oldModeloRepuestoOfLs_repuestosNewRepuesto.getLs_repuestos().remove(ls_repuestosNewRepuesto);
                        oldModeloRepuestoOfLs_repuestosNewRepuesto = em.merge(oldModeloRepuestoOfLs_repuestosNewRepuesto);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = modeloRepuesto.getId();
                if (findModeloRepuesto(id) == null) {
                    throw new NonexistentEntityException("The modeloRepuesto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ModeloRepuesto modeloRepuesto;
            try {
                modeloRepuesto = em.getReference(ModeloRepuesto.class, id);
                modeloRepuesto.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The modeloRepuesto with id " + id + " no longer exists.", enfe);
            }
            MarcaRepuesto marca = modeloRepuesto.getMarca();
            if (marca != null) {
                marca.getLs_modelos().remove(modeloRepuesto);
                marca = em.merge(marca);
            }
            List<Repuesto> ls_repuestos = modeloRepuesto.getLs_repuestos();
            for (Repuesto ls_repuestosRepuesto : ls_repuestos) {
                ls_repuestosRepuesto.setModeloRepuesto(null);
                ls_repuestosRepuesto = em.merge(ls_repuestosRepuesto);
            }
            em.remove(modeloRepuesto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ModeloRepuesto> findModeloRepuestoEntities() {
        return findModeloRepuestoEntities(true, -1, -1);
    }

    public List<ModeloRepuesto> findModeloRepuestoEntities(int maxResults, int firstResult) {
        return findModeloRepuestoEntities(false, maxResults, firstResult);
    }

    private List<ModeloRepuesto> findModeloRepuestoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(ModeloRepuesto.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ModeloRepuesto findModeloRepuesto(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ModeloRepuesto.class, id);
        } finally {
            em.close();
        }
    }

    public int getModeloRepuestoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<ModeloRepuesto> rt = cq.from(ModeloRepuesto.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
    public List<ModeloRepuesto> getModeloRepuestosPorMarcaRepuesto(Long id) {
        EntityManager em = getEntityManager();
        List<ModeloRepuesto> result = null;
        try {
            String jpql = "SELECT m FROM ModeloRepuesto m JOIN m.marca mar WHERE mar.id =:id";
            Query query = em.createQuery(jpql);
            query.setParameter("id", id);
            result = query.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (result);
    }
    
    public boolean yaExiste(String value, Long id_excepcion) {
        EntityManager em = getEntityManager();
        List<ModeloRepuesto> result = null;
        try {
            if(value.equals("NO DEFINIDO")){
                return false;
            }
            String jpql = "SELECT p FROM ModeloRepuesto p WHERE p.descripcion =:value";            
            Query query = em.createQuery(jpql);
            query.setParameter("value", value);
            result = query.getResultList();
            if(result.isEmpty())
                return false;
            else{
               for(ModeloRepuesto v: result){
                   if(v.getId().equals(id_excepcion))
                       return false;
               }
               return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    
}
